<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>CREATE VIEW</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="REFENTRY">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="sql-createuser.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="sql-createuser.html">快退</a></td><td width="60%" align="center" valign="bottom"></td><td width="10%" align="right" valign="top"><a href="sql-deallocate.html">快进</a></td><td width="10%" align="right" valign="top"><a href="sql-deallocate.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<h1><a name="SQL-CREATEVIEW"></a>CREATE VIEW</h1>
<div class="REFNAMEDIV"><a name="AEN49932"></a><h2>名称</h2>CREATE VIEW&nbsp;--&nbsp;定义一个新视图</div>
<a name="AEN49935"></a>
<div class="REFSYNOPSISDIV"><a name="AEN49937"></a><h2>语法</h2>
<pre class="SYNOPSIS">CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW <tt class="REPLACEABLE"><i>name</i></tt> [ ( <tt class="REPLACEABLE"><i>column_name</i></tt> [, ...] ) ]
    AS <tt class="REPLACEABLE"><i>query</i></tt></pre>
</div>
<div class="REFSECT1"><a name="AEN49942"></a><h2>描述</h2>
<p><tt class="COMMAND">CREATE VIEW</tt> 定义一个查询的视图。这个视图不是物理上实际存在的，并且在该视图每次被引用的时候都会运行一次 <tt class="REPLACEABLE"><i>query</i></tt></p>
<p><tt class="COMMAND">CREATE OR REPLACE VIEW</tt> 类似，不过是如果一个同名的视图已经存在，那么将替换它。你只能用一个生成相同字段的新查询替换一个视图(字段名和数据类型都相同)。</p>
<p>如果给出了一个模式名(比如 <tt class="LITERAL">CREATE VIEW myschema.myview ...</tt>)，那么该视图将在指定的模式中创建，否则将在当前模式中创建。临时视图存在于一个特殊的模式里，所以创建临时视图的时候，不用给出模式名。新视图名字必需和同一模式中任何其它视图、表、序列、索引的名字不同。</p>
</div>
<div class="REFSECT1"><a name="AEN49950"></a><h2>参数</h2>
<div class="VARIABLELIST">
<dl>
<dt><tt class="LITERAL">TEMPORARY</tt> 或 <tt class="LITERAL">TEMP</tt></dt>
<dd><p>如果声明了这个子句，那么视图就以临时视图的方式创建。临时视图在当前会话结束的时候将被自动删除。当前会话中，在临时视图存在的期间，将无法看到现有的同名关系，除非用模式修饰的名字引用它们。</p>
<p>如果视图引用的任何基础表是临时的，那么视图将被创建为临时的(不管是否声明了 <tt class="LITERAL">TEMPORARY</tt>)。</p></dd>
<dt><tt class="REPLACEABLE"><i>name</i></tt></dt>
<dd><p>所要创建的视图名称(可以有模式修饰)</p></dd>
<dt><tt class="REPLACEABLE"><i>column_name</i></tt></dt>
<dd><p>一个可选的名字列表，用作视图的字段名。如果没有给出，字段名取自查询。</p></dd>
<dt><tt class="REPLACEABLE"><i>query</i></tt></dt>
<dd><p>一个将为视图提供行和列的 <a href="sql-select.html"><i>SELECT</i></a> 或 <a href="sql-values.html"><i>VALUES</i></a> 语句。</p></dd>
</dl>
</div>
</div>
<div class="REFSECT1"><a name="AEN49978"></a><h2>注意</h2>
<p>目前，视图是只读的：系统将不允许在视图上插入、更新、删除数据。你可以通过在视图上创建把插入等动作重写为向其它表做合适操作的规则来实现可更新视图的效果。更多信息详见 <a href="sql-createrule.html"><i>CREATE RULE</i></a> 。</p>
<p>使用 <a href="sql-dropview.html"><i>DROP VIEW</i></a> 语句删除视图。</p>
<p>请注意视图字段的名字和类型不一定是你们期望的那样。比如，</p>
<pre class="PROGRAMLISTING">CREATE VIEW vista AS SELECT 'Hello World';</pre>
<p>在两个方面很糟糕：字段名缺省是 <tt class="LITERAL">?column?</tt> 并且字段的数据类型缺省是 <tt class="TYPE">unknown</tt> 。如果你想视图的结果是一个字符串文本，那么请像下面这样使用</p>
<pre class="PROGRAMLISTING">CREATE VIEW vista AS SELECT text 'Hello World' AS hello;</pre>
<p>对视图引用的表的访问的权限由视图的所有者决定。不过，在视图里调用的函数当作他们直接从使用视图的查询里调用看待。因此，视图的用户必须有使用视图调用的所有函数的权限。</p>
</div>
<div class="REFSECT1"><a name="AEN49990"></a><h2>例子</h2>
<p>创建一个由所有喜剧电影组成的视图：</p>
<pre class="PROGRAMLISTING">CREATE VIEW comedies AS
    SELECT *
    FROM films
    WHERE kind = 'Comedy';</pre>
</div>
<div class="REFSECT1"><a name="AEN49994"></a><h2>兼容性</h2>
<p>SQL 标准为 <tt class="COMMAND">CREATE VIEW</tt> 声明了一些附加的功能：</p>
<pre class="SYNOPSIS">CREATE VIEW <tt class="REPLACEABLE"><i>name</i></tt> [ ( <tt class="REPLACEABLE"><i>column_name</i></tt> [, ...] ) ]
    AS <tt class="REPLACEABLE"><i>query</i></tt>
    [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]</pre>
<p>完整的 SQL 命令可选的子句是：</p>
<div class="VARIABLELIST">
<dl>
<dt><tt class="LITERAL">CHECK OPTION</tt></dt>
<dd><p>这个选项用于可更新视图。所有对视图的 <tt class="COMMAND">INSERT</tt> 和 <tt class="COMMAND">UPDATE</tt> 都要经过视图定义条件的校验。也就是说，新数据应该可以通过视图看到。如果没有通过校验，更新将被拒绝。</p></dd>
<dt><tt class="LITERAL">LOCAL</tt></dt>
<dd><p>对这个视图进行完整性检查</p></dd>
<dt><tt class="LITERAL">CASCADED</tt></dt>
<dd><p>对此视图和任何相关视图进行完整性检查。在既没有声明 <tt class="LITERAL">CASCADED</tt> 也没有声明 <tt class="LITERAL">LOCAL</tt> 时，假设为 <tt class="LITERAL">CASCADED</tt> 。</p></dd>
</dl>
</div>
<p><tt class="COMMAND">CREATE OR REPLACE VIEW</tt> 是 PostgreSQL 的扩展。临时视图的概念也是扩展。</p>
</div>
<div class="REFSECT1"><a name="AEN50027"></a><h2>又见</h2><a href="sql-dropview.html"><i>DROP VIEW</i></a></div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="sql-createuser.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="sql-deallocate.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">CREATE USER</td><td width="34%" align="center" valign="top"><a href="sql-commands.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">DEALLOCATE</td></tr>
</table>
</div>
</body></html>